ARIA ๋ผ์ด๋ธ ๋ฆฌ์ ์ ๋ง์คํฐํ์ฌ ๋์ ์ฝํ ์ธ ์ ์น ์ ๊ทผ์ฑ์ ํฅ์์ํค์ธ์. ์ ์คํ(polite) ๋ฐ ์ ๊ทน์ ์ธ(assertive) ์๋ฆผ ๊ตฌํ ๋ฐฉ๋ฒ, ๋ชจ๋ฒ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ํฌ์ฉ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํ ํจ์ ํผํ๊ธฐ๋ฅผ ๋ฐฐ์๋ณด์ธ์.
๋ผ์ด๋ธ ๋ฆฌ์ : ๊ธ๋ก๋ฒ ์ ๊ทผ์ฑ์ ์ํ ๋์ ์ฝํ ์ธ ์๋ฆผ ๋ง์คํฐํ๊ธฐ
์ํธ ์ฐ๊ฒฐ๋ ๋์งํธ ์ธ์์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ด์ ์ ์ ์ธ ํ์ด์ง๊ฐ ์๋๋๋ค. ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ๋๊ณ , ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ํ๋ฉฐ, ์๋ก์ด ์ ๋ณด๋ฅผ ์ํํ๊ฒ ๊ฐ์ ธ์ค๋ ๋์ ์ด๊ณ ์ํธ์์ฉ์ ์ธ ํ๊ฒฝ์ ๋๋ค. ์ด๋ฌํ ์ญ๋์ฑ์ ๋ง์ ์ฌ์ฉ์์๊ฒ ํ๋ถํ ๊ฒฝํ์ ์ ๊ณตํ์ง๋ง, ์คํฌ๋ฆฐ ๋ฆฌ๋์ ๊ฐ์ ๋ณด์กฐ ๊ธฐ์ ์ ์์กดํ๋ ๊ฐ์ธ์๊ฒ๋ ์ข ์ข ์๋นํ ์ฅ๋ฒฝ์ด ๋ฉ๋๋ค. ์ผํ ์นดํธ์ ํฉ๊ณ ๊ธ์ก์ด ์ ๋ฐ์ดํธ๋๊ฑฐ๋, ์ด๋ฉ์ผ ์๋ฆผ์ด ๋ํ๋๊ฑฐ๋, ์์ ์ ๋ ฅ์ด ์ค์๊ฐ์ผ๋ก ๊ฒ์ฆ๋๋ ์ํฉ์ ์์ํด ๋ณด์ญ์์ค. ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ฌ์ฉ์์๊ฒ ์ด๋ฌํ ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ธ์ง๋์ง ์์ ์ ์์ผ๋ฉฐ, ์ด๋ ์ข์ ๊ฐ, ์ค๋ฅ ๋๋ ์์ ์๋ฃ ๋ถ๋ฅ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๋ฐ๋ก ์ด ์ง์ ์์ ARIA ๋ผ์ด๋ธ ๋ฆฌ์ (Live Regions)์ด ํ์ ๋ถ๊ฐ๊ฒฐํด์ง๋๋ค. ๋ผ์ด๋ธ ๋ฆฌ์ ์ ๋์ ์น ์ฝํ ์ธ ์ ๋ณด์กฐ ๊ธฐ์ ๊ฐ์ ๊ฒฉ์ฐจ๋ฅผ ํด์ํ๊ธฐ ์ํด ์ค๊ณ๋ ๊ฐ๋ ฅํ WAI-ARIA(Web Accessibility Initiative - Accessible Rich Internet Applications) ์ฌ์์ ๋๋ค. ์ด๋ ์น ๊ฐ๋ฐ์๊ฐ ํ์ด์ง์ ์ฝํ ์ธ ๋ณ๊ฒฝ ์ฌํญ์ ์คํฌ๋ฆฐ ๋ฆฌ๋์ ๋ช ์์ ์ผ๋ก ์๋ฆด ์ ์๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ, ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์๋์ผ๋ก ์๋ก ๊ณ ์น๊ฑฐ๋ ํ์ํ ํ์ ์์ด ์๊ธฐ์ ์ ํ๊ณ ๊ด๋ จ์ฑ ์๋ ์๋ฆผ์ ๋ฐ์ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ฌ์ฉ์์ ๊ฒฝ์ฐ, ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ค์์ฑ์ ๋จ์ํ ๊ธฐ์ ๊ตฌํ์ ๋์ด์ญ๋๋ค. ์ด๋ ๋ค์ํ ๋ฐฐ๊ฒฝ, ๋ฅ๋ ฅ, ์์น์ ๊ฐ์ธ๋ค์ด ์น ์ฝํ ์ธ ์ ๋๋ฑํ๊ฒ ์ ๊ทผํ๊ณ ์ํธ์์ฉํ ์ ์๋๋ก ๋ณด์ฅํ๋ ๋์งํธ ํฌ์ฉ์ ์์น์ ๊ตฌํํฉ๋๋ค. ๋์ฟ์์ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ฌ์ฉํ๋ , ๋ฒ ๋ฅผ๋ฆฐ์์ ์ ์ ๋์คํ๋ ์ด๋ฅผ ์ฌ์ฉํ๋ , ๋ณด๊ณ ํ์์ ์์ฑ ์ ๋ ฅ์ผ๋ก ํ์ํ๋ , ์ ๊ตฌํ๋ ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ผ๊ด๋๊ณ ๊ณตํํ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
๋์ ์น: ๊ธฐ์กด ์ ๊ทผ์ฑ์ ๋ํ ๋์ ๊ณผ์
์ญ์ฌ์ ์ผ๋ก ์น ์ฝํ ์ธ ๋ ๋์ฒด๋ก ์ ์ ์ด์์ต๋๋ค. ํ์ด์ง๊ฐ ๋ก๋๋๋ฉด ๊ทธ ์ฝํ ์ธ ๋ ๊ณ ์ ๋์ด ์์์ต๋๋ค. ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ด ์ ์ ์ธ DOM(Document Object Model)์ ํด์ํ๊ณ ์ ํ์ ์ผ๋ก ์ ์ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ JavaScript ํ๋ ์์ํฌ์ API์ ์ํด ์ฃผ๋๋๋ ํ๋ ์น ๊ฐ๋ฐ์ ํจ๋ฌ๋ค์์ ์ ํ์ ๊ฐ์ ธ์์ต๋๋ค:
- ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPAs): ํ์ด์ง๊ฐ ์ ์ฒด์ ์ผ๋ก ๋ค์ ๋ก๋๋์ง ์๊ณ , ๋์ผํ ๋ทฐ ๋ด์์ ์ฝํ ์ธ ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์น์ ๊ฐ ์ด๋์ด๋ ์๋ก์ด ๋ฐ์ดํฐ ๋ก๋๋ ์ข ์ข ํ์ด์ง์ ์ผ๋ถ๋ง ๋ณ๊ฒฝํฉ๋๋ค.
- ์ค์๊ฐ ์ ๋ฐ์ดํธ: ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ , ์ฃผ์ ์์ธ ํ์๊ธฐ, ๋ด์ค ํผ๋ ๋ฐ ์๋ฆผ ์์คํ ์ ์ฌ์ฉ์ ์ํธ์์ฉ ์์ด ์ง์์ ์ผ๋ก ์๋ก์ด ์ ๋ณด๋ฅผ ํธ์ํฉ๋๋ค.
- ์ํธ์์ฉ ์์: ์ฆ๊ฐ์ ์ธ ์ ํจ์ฑ ๊ฒ์ฌ ๊ธฐ๋ฅ์ด ์๋ ์์, ์งํ๋ฅ ํ์๊ธฐ, ๊ฒ์ ์ ์, ํํฐ๋ง๋ ๋ชฉ๋ก ๋ฑ์ ์ฌ์ฉ์๊ฐ ์ํธ์์ฉํจ์ ๋ฐ๋ผ DOM์ ์์ ํฉ๋๋ค.
์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆฌ๋ ๋ฉ์ปค๋์ฆ์ด ์์ผ๋ฉด ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ข ์ข ์ด๋ฅผ ์ธ์งํ์ง ๋ชปํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์์์ ์์ฑํ๊ณ ์ ์ถ ๋ฒํผ์ ํด๋ฆญํ์ ๋, ์๊ฐ์ ์ผ๋ก๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ํ๋์ง๋ง ์ ํ ์๋ ค์ง์ง ์์ ํผ๋์ค๋ฌ์ํ๋ฉฐ ์งํํ ์ ์๊ฒ ๋ ์ ์์ต๋๋ค. ๋๋ ํ์ ๋๊ตฌ์์ ์ค์ํ ์ฑํ ๋ฉ์์ง๋ฅผ ๋์น ์๋ ์์ต๋๋ค. ์ด๋ฌํ ์กฐ์ฉํ ์คํจ๋ ์ด์ ํ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋ฉฐ ๊ทผ๋ณธ์ ์ผ๋ก ์ ๊ทผ์ฑ์ ํผ์ํฉ๋๋ค.
ARIA ๋ผ์ด๋ธ ๋ฆฌ์ ์๊ฐ: ํด๊ฒฐ์ฑ
ARIA ๋ผ์ด๋ธ ๋ฆฌ์ ์ ๊ฐ๋ฐ์๊ฐ ์น ํ์ด์ง์ ํน์ ์์ญ์ "๋ผ์ด๋ธ"๋ก ์ง์ ํ ์ ์๊ฒ ํจ์ผ๋ก์จ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด ์ง์ ๋ ์์ญ ๋ด์ ์ฝํ ์ธ ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ณด์กฐ ๊ธฐ์ ์ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๋๋ก ์ง์๋ฐ์ต๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์ ๋ฐ์ดํธ๋ ์ฝํ ์ธ ์ ์๋์ผ๋ก ์ด์ ์ ๋ง์ถ ํ์ ์์ด ์๋์ผ๋ก ๋ฐ์ํฉ๋๋ค.
ํต์ฌ ์์ฑ: aria-live
๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฃผ์ ์์ฑ์ aria-live
์
๋๋ค. ์ด ์์ฑ์ ์ธ ๊ฐ์ง ๊ฐ ์ค ํ๋๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์๋ฆผ์ ๊ธด๊ธ์ฑ๊ณผ ์ค๋จ ์์ค์ ๊ฒฐ์ ํฉ๋๋ค:
1. aria-live="polite"
์ด๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ ํธ๋๋ ๊ฐ์
๋๋ค. aria-live="polite"
๊ฐ ์์์ ์ ์ฉ๋๋ฉด, ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ฌ์ฉ์๊ฐ ํ์ฌ ์์
์ ์ ํด ์ํ์ด๊ฑฐ๋ ์ผ์ ์ค์งํ์ ๋ ์ฝํ
์ธ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆฝ๋๋ค. ์ฌ์ฉ์์ ํ์ฌ ์ฝ๊ธฐ๋ ์ํธ์์ฉ์ ์ค๋จ์ํค์ง ์์ต๋๋ค. ์ด๋ ์ค์ํ์ง ์์ ์ ๋ณด์ฑ ์
๋ฐ์ดํธ์ ์ด์์ ์
๋๋ค.
aria-live="polite"
์ฌ์ฉ ์ฌ๋ก:
- ์ผํ ์นดํธ ์ ๋ฐ์ดํธ: ํญ๋ชฉ์ด ์นดํธ์ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋์ด ์ด์ก์ด ์ ๋ฐ์ดํธ๋ ๋. ์ฌ์ฉ์๋ฅผ ์ฆ์ ์ค๋จ์ํฌ ํ์๋ ์์ผ๋ฉฐ, ํ์ฌ ์์ ์ ๋ง์น ํ์ ์ ๋ฐ์ดํธ๋ฅผ ๋ฃ๊ฒ ๋ฉ๋๋ค.
- ์งํ๋ฅ ํ์๊ธฐ: ํ์ผ ์ ๋ก๋ ์ํ, ๋ค์ด๋ก๋ ์งํ๋ฅ ํ์์ค ๋๋ ๋ก๋ฉ ์คํผ๋. ์ฌ์ฉ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ์ผ๋ฉด์ ํ์ด์ง์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ ๊ณ์ ์ํธ์์ฉํ ์ ์์ต๋๋ค.
- ๊ฒ์ ๊ฒฐ๊ณผ ์: "12๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๊ฒ์๋์์ต๋๋ค." ๋๋ "๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค."
- ๋ด์ค ํผ๋/ํ๋ ์คํธ๋ฆผ: ์์ ๋ฏธ๋์ด ํผ๋๋ ๊ณต๋ ์์ ๋ฌธ์์ ํ๋ ๋ก๊ทธ์ ์ ๊ฒ์๋ฌผ์ด ๋ํ๋ ๋.
- ์์ ์ฑ๊ณต ๋ฉ์์ง: "์ธ๋ถ ์ ๋ณด๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ ์ฅ๋์์ต๋๋ค."
์์ (Polite):
<div aria-live="polite" id="cart-status">์ฅ๋ฐ๊ตฌ๋๊ฐ ๋น์ด ์์ต๋๋ค.</div>
<!-- ๋์ค์ JavaScript๋ฅผ ํตํด ํญ๋ชฉ์ด ์ถ๊ฐ๋ ๋ -->
<script>
document.getElementById('cart-status').textContent = '์ฅ๋ฐ๊ตฌ๋์ 1๊ฐ์ ์ํ์ด ์์ต๋๋ค. ์ด์ก: $25.00';
</script>
์ด ์์์ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ฌ์ฉ์๊ฐ ํ์ดํ์ด๋ ํ์๊ณผ ๊ฐ์ ํ์ฌ ์์ ์ ๋ง์น ํ์ "์ฅ๋ฐ๊ตฌ๋์ 1๊ฐ์ ์ํ์ด ์์ต๋๋ค. ์ด์ก: $25.00"๋ผ๊ณ ์ ์คํ๊ฒ ์๋ฆฝ๋๋ค.
2. aria-live="assertive"
์ด ๊ฐ์ ๊ธด๊ธํ๊ณ ์ค์ํ ๋ณ๊ฒฝ์ ์๋ฏธํฉ๋๋ค. aria-live="assertive"
๊ฐ ์ฌ์ฉ๋๋ฉด ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ฌ์ฉ์์ ํ์ฌ ์์
์ด๋ ์๋ฆผ์ ์ค๋จํ๊ณ ์ฆ์ ์๋ก์ด ์ฝํ
์ธ ๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ด๋ ์ฆ๊ฐ์ ์ธ ์ฃผ์๊ฐ ์ ๋์ ์ผ๋ก ํ์ํ ์ ๋ณด์ ๋ํด์๋ง ๋๋ฌผ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
aria-live="assertive"
์ฌ์ฉ ์ฌ๋ก:
- ์ค๋ฅ ๋ฉ์์ง: "์๋ชป๋ ๋น๋ฐ๋ฒํธ์ ๋๋ค. ๋ค์ ์๋ํ์ญ์์ค." ๋๋ "์ด ํ๋๋ ํ์์ ๋๋ค." ์ด๋ฌํ ์ค๋ฅ๋ ์ฌ์ฉ์์ ์งํ์ ๋ง์ผ๋ฏ๋ก ์ฆ๊ฐ์ ์ธ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
- ์ค์ ์์คํ ๊ฒฝ๊ณ : "์ธ์ ์ด ๊ณง ๋ง๋ฃ๋ฉ๋๋ค." ๋๋ "๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ๋์ด์ก์ต๋๋ค."
- ์๊ฐ์ ๋ฏผ๊ฐํ ์๋ฆผ: ์จ๋ผ์ธ ๋ฑ ํน ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ํ ๊ฒฝ๊ณ ๋๋ ๊ธด๊ธ ๋ฐฉ์ก.
์์ (Assertive):
<div aria-live="assertive" id="error-message" style="color: red;"></div>
<!-- ๋์ค์ ์์ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์คํจํ ๋ -->
<script>
document.getElementById('error-message').textContent = '์ ํจํ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์
๋ ฅํ์ญ์์ค.';
</script>
์ฌ๊ธฐ์ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ํ๋ ์ผ์ ์ฆ์ ์ค๋จํ๊ณ "์ ํจํ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ ๋ ฅํ์ญ์์ค."๋ผ๊ณ ์๋ฆฝ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ๋ฌธ์ ๋ฅผ ์ฆ์ ์ธ์งํ ์ ์์ต๋๋ค.
3. aria-live="off"
์ด๋ ๋ผ์ด๋ธ ๋ฆฌ์ ์ผ๋ก ์ง์ ๋์ง ์์ ์์์ ๊ธฐ๋ณธ๊ฐ์
๋๋ค. ์ฆ, ์ด ์์ ๋ด์ ์ฝํ
์ธ ๋ณ๊ฒฝ ์ฌํญ์ ๋ช
์์ ์ผ๋ก ์ด์ ์ด ์ด๋ํ์ง ์๋ ํ ์คํฌ๋ฆฐ ๋ฆฌ๋์ ์ํด ์๋ ค์ง์ง ์์ต๋๋ค. aria-live="off"
๋ฅผ ๋ช
์์ ์ผ๋ก ์ค์ ํ ํ์๋ ๊ฑฐ์ ์์ง๋ง(๊ธฐ๋ณธ๊ฐ์ด๋ฏ๋ก), ํน์ ์๋๋ฆฌ์ค์์ ์์๋ ๋ผ์ด๋ธ ๋ฆฌ์ ์ค์ ์ ์ฌ์ ์ํ๊ฑฐ๋ ์ฝํ
์ธ ์น์
์ ๋ํ ์๋ฆผ์ ์ผ์์ ์ผ๋ก ๋นํ์ฑํํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ผ์ด๋ธ ๋ฆฌ์ ์ญํ (Role) ์์ฑ
aria-live
์ธ์๋ ARIA๋ aria-live
๋ฐ ๊ธฐํ ์์ฑ์ ์์์ ์ผ๋ก ์ค์ ํ๋ ํน์ role
์์ฑ์ ์ ๊ณตํ์ฌ ์๋ฏธ๋ก ์ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๊ณ ์ข
์ข
๋ ๋์ ๊ต์ฐจ ๋ธ๋ผ์ฐ์ /์คํฌ๋ฆฐ ๋ฆฌ๋ ์ง์์ ์ ๊ณตํฉ๋๋ค. ํด๋น๋๋ ๊ฒฝ์ฐ ์ด๋ฌํ ์ญํ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ์ ํธ๋ฉ๋๋ค.
1. role="status"
status
๋ผ์ด๋ธ ๋ฆฌ์ ์ ์์์ ์ผ๋ก aria-live="polite"
๋ฐ aria-atomic="true"
์
๋๋ค. ์ค์ํ์ง ์์ ๋น๋ํํ ์ํ ๋ฉ์์ง๋ฅผ ์ํด ์ค๊ณ๋์์ต๋๋ค. ๋ณ๊ฒฝ ์ ์์ญ์ ์ ์ฒด ๋ด์ฉ์ด ์๋ ค์ง๋๋ค.
์ฌ์ฉ ์ฌ๋ก:
- ํ์ธ ๋ฉ์์ง: "์ํ์ด ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ๋์์ต๋๋ค.", "์ค์ ์ด ์ ์ฅ๋์์ต๋๋ค."
- ๋น๋๊ธฐ ์์
์งํ๋ฅ : "๋ฐ์ดํฐ ๋ก๋ฉ ์ค..." (์งํ๋ฅ ์๋
role="progressbar"
๊ฐ ๋ ๊ตฌ์ฒด์ ์ผ ์ ์์). - ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ํ ์ ๋ณด: "100๊ฐ ์ค 1-10๊ฐ ๊ฒฐ๊ณผ ํ์ ์ค."
์์:
<div role="status" id="confirmation-message"></div>
<!-- ์ฑ๊ณต์ ์ธ ์์ ์ ์ถ ํ -->
<script>
document.getElementById('confirmation-message').textContent = '์ฃผ๋ฌธ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์ต๋๋ค!';
</script>
2. role="alert"
alert
๋ผ์ด๋ธ ๋ฆฌ์ ์ ์์์ ์ผ๋ก aria-live="assertive"
๋ฐ aria-atomic="true"
์
๋๋ค. ์ฆ๊ฐ์ ์ธ ์ฌ์ฉ์ ์ฃผ์๊ฐ ํ์ํ ์ค์ํ๊ณ ์๊ฐ์ ๋ฏผ๊ฐํ๋ฉฐ ์ข
์ข
์น๋ช
์ ์ธ ๋ฉ์์ง๋ฅผ ์ํ ๊ฒ์
๋๋ค. ์ค์ ๊ฒฝ๋ณด์ฒ๋ผ ์ฌ์ฉ์๋ฅผ ์ค๋จ์ํต๋๋ค.
์ฌ์ฉ ์ฌ๋ก:
- ์ ํจ์ฑ ๊ฒ์ฌ ์ค๋ฅ: "์ด๋ฏธ ์ฌ์ฉ ์ค์ธ ์ฌ์ฉ์ ์ด๋ฆ์ ๋๋ค.", "๋น๋ฐ๋ฒํธ๊ฐ ๋๋ฌด ์งง์ต๋๋ค."
- ์์คํ ์ค์ ๊ฒฝ๊ณ : "๋์คํฌ ๊ณต๊ฐ ๋ถ์กฑ.", "๊ฒฐ์ ์คํจ."
- ์ธ์ ์๊ฐ ์ด๊ณผ: "60์ด ํ์ ์ธ์ ์ด ๋ง๋ฃ๋ฉ๋๋ค."
์์:
<div role="alert" id="form-error" style="color: red;"></div>
<!-- ํ์ ํ๋๊ฐ ๋น์ด ์์ ๋ -->
<script>
document.getElementById('form-error').textContent = '๋ชจ๋ ํ์ ํ๋๋ฅผ ์
๋ ฅํ์ญ์์ค.';
</script>
3. role="log"
log
๋ผ์ด๋ธ ๋ฆฌ์ ์ ์์์ ์ผ๋ก aria-live="polite"
๋ฐ aria-relevant="additions"
์
๋๋ค. ์ฑํ
๊ธฐ๋ก์ด๋ ์ด๋ฒคํธ ๋ก๊ทธ์ ๊ฐ์ด ์๊ฐ ์์๋๋ก ๊ธฐ๋ก๋๋ ๋ฉ์์ง๋ฅผ ์ํด ์ค๊ณ๋์์ต๋๋ค. ์ ํญ๋ชฉ์ ์ฌ์ฉ์ ํ๋ฆ์ ๋ฐฉํดํ์ง ์๊ณ ์๋ ค์ง๋ฉฐ, ์ด์ ํญ๋ชฉ์ ์ปจํ
์คํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ง๋ฉ๋๋ค.
์ฌ์ฉ ์ฌ๋ก:
- ์ ๋ฉ์์ง๊ฐ ๋ํ๋๋ ์ฑํ ์ฐฝ.
- ์ต๊ทผ ์ฌ์ฉ์ ํ๋์ ๋ณด์ฌ์ฃผ๋ ํ๋ ํผ๋.
- ์์คํ ์ฝ์ ์ถ๋ ฅ ๋๋ ๋๋ฒ๊ทธ ๋ก๊ทธ.
์์:
<div role="log" id="chat-window" style="height: 200px; overflow-y: scroll; border: 1px solid #ccc; padding: 10px;">
<p><strong>์ฌ์ฉ์ A:</strong> ์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ!</p>
</div>
<!-- ์ ๋ฉ์์ง๊ฐ ๋์ฐฉํ์ ๋ -->
<script>
const chatWindow = document.getElementById('chat-window');
const newMessage = document.createElement('p');
newMessage.innerHTML = '<strong>์ฌ์ฉ์ B:</strong> ์๋
ํ์ธ์, ์ฌ์ฉ์ A๋!';
chatWindow.appendChild(newMessage);
chatWindow.scrollTop = chatWindow.scrollHeight; // ์ ๋ฉ์์ง๋ก ์คํฌ๋กค
</script>
์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ ์ฒด ์ฑํ ๊ธฐ๋ก์ ๋ค์ ์๋ฆฌ์ง ์๊ณ ์ ๋ฉ์์ง๊ฐ ๋ํ๋ ๋ "์ฌ์ฉ์ B: ์๋ ํ์ธ์, ์ฌ์ฉ์ A๋!"์ด๋ผ๊ณ ์๋ฆฝ๋๋ค.
4. role="marquee"
์์์ ์ผ๋ก aria-live="off"
์
๋๋ค. ์ด ์ญํ ์ ์์ฃผ ์
๋ฐ์ดํธ๋์ง๋ง ์ฌ์ฉ์๋ฅผ ๋ฐฉํดํ ๋งํผ ์ค์ํ์ง ์์ ์ฝํ
์ธ ๋ฅผ ๋ํ๋
๋๋ค. ์ฃผ์ ์์ธ ํ์๊ธฐ๋ ์คํฌ๋กค๋๋ ๋ด์ค ํค๋๋ผ์ธ์ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ๋ฐฉํด์ ์ธ ํน์ฑ๊ณผ ์ข
์ข
์ ๊ทผํ๊ธฐ ์ด๋ ค์ด ์คํฌ๋กค ๋๋ฌธ์, role="marquee"
๋ ์ผ์ ์ค์ง/์ฌ์ ์ ์ด ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์ ์คํ๊ฒ ๊ตฌํ๋์ง ์๋ ํ ์ ๊ทผ์ฑ ๋ชฉ์ ์ผ๋ก๋ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ต๋๋ค.
5. role="timer"
๊ธฐ๋ณธ์ ์ผ๋ก ์์์ ์ผ๋ก aria-live="off"
์ด์ง๋ง, ํ์ด๋จธ ๊ฐ์ด ์ค์ํ ๊ฒฝ์ฐ ์ ์ฉํ ์๋ฆผ์ ์ํด aria-live="polite"
๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์นด์ดํธ๋ค์ด ์๊ณ์ฒ๋ผ ์์ฃผ ์
๋ฐ์ดํธ๋๋ ์ซ์ ์นด์ดํฐ๋ฅผ ๋ํ๋
๋๋ค. ๊ฐ๋ฐ์๋ ํ์ด๋จธ๊ฐ ์ผ๋ง๋ ์์ฃผ ๋ณ๊ฒฝ๋๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆฌ๋ ๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ฌ์ฉ ์ฌ๋ก:
- ์ด๋ฒคํธ๊น์ง์ ์นด์ดํธ๋ค์ด.
- ์ํ์ ๋จ์ ์๊ฐ.
์์ (Polite Timer):
<div role="timer" aria-live="polite" id="countdown">๋จ์ ์๊ฐ: 05:00</div>
<!-- ๋งค์ด ์
๋ฐ์ดํธ, ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ ์คํ ๊ฐ๊ฒฉ์ผ๋ก ์๋ฆผ -->
<script>
let seconds = 300;
setInterval(() => {
seconds--;
const minutes = Math.floor(seconds / 60);
const remainingSeconds = seconds % 60;
document.getElementById('countdown').textContent = `๋จ์ ์๊ฐ: ${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
}, 1000);
</script>
์ธ๋ถํ ๋ฐ ์ ์ด: aria-atomic
๊ณผ aria-relevant
aria-live
๊ฐ ๊ธด๊ธ์ฑ์ ๊ฒฐ์ ํ๋ ๋ฐ๋ฉด, aria-atomic
๊ณผ aria-relevant
๋ ๋ผ์ด๋ธ ๋ฆฌ์ ๋ด์์ ์ค์ ๋ก ์ด๋ค ์ฝํ
์ธ ๊ฐ ์๋ ค์ง์ง์ ๋ํ ์ธ๋ฐํ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
aria-atomic="true"
๋ false
(๊ธฐ๋ณธ๊ฐ)
์ด ์์ฑ์ ์คํฌ๋ฆฐ ๋ฆฌ๋์๊ฒ ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ ์ฒด ๋ด์ฉ์ ์๋ฆด์ง(atomic = true), ์๋๋ฉด ๋ณ๊ฒฝ๋ ํน์ ๋ถ๋ถ๋ง ์๋ฆด์ง(atomic = false, ๊ธฐ๋ณธ ๋์)๋ฅผ ์๋ ค์ค๋๋ค. ๊ธฐ๋ณธ๊ฐ์ false
์ด์ง๋ง, role="status"
์ role="alert"
์์๋ ์์์ ์ผ๋ก true
์
๋๋ค.
aria-atomic="true"
: ๋ผ์ด๋ธ ๋ฆฌ์ ๋ด๋ถ์ ์ฝํ ์ธ ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ํด๋น ๋ฆฌ์ ๋ด์ ๋ชจ๋ ํ์ฌ ์ฝํ ์ธ ๋ฅผ ์๋ฆฝ๋๋ค. ์ด๋ ๋ฉ์์ง ์ ์ฒด์ ์ปจํ ์คํธ๊ฐ ์ค์ํ ๋ ์ ์ฉํ๋ฉฐ, ๋น๋ก ์์ ๋ถ๋ถ๋ง ๋ณ๊ฒฝ๋์๋๋ผ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.aria-atomic="false"
: ๋ผ์ด๋ธ ๋ฆฌ์ ๋ด์์ ์๋ก ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋ ํ ์คํธ๋ง ์๋ ค์ง๋๋ค. ์ด๋ ๋ ์ฅํฉํ ์ ์์ง๋ง ์ ์คํ๊ฒ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ์ปจํ ์คํธ๋ฅผ ์์ ์ ์์ต๋๋ค.
์์ (aria-atomic
):
ํ ์คํธ๊ฐ ์๋ ์งํ๋ฅ ํ์์ค์ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค:
<div aria-live="polite" aria-atomic="true" id="upload-status">ํ์ผ ์
๋ก๋ ์ค: <span>0%</span></div>
<!-- ์งํ๋ฅ ์
๋ฐ์ดํธ ์ -->
<script>
let progress = 0;
const statusDiv = document.getElementById('upload-status');
const progressSpan = statusDiv.querySelector('span');
const interval = setInterval(() => {
progress += 10;
progressSpan.textContent = `${progress}%`;
if (progress >= 100) {
clearInterval(interval);
statusDiv.textContent = '์
๋ก๋ ์๋ฃ.';
}
}, 1000);
</script>
aria-atomic="true"
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฑ๋ถ์จ์ด "0%"์์ "10%"๋ก ๋ณ๊ฒฝ๋ ๋ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ "ํ์ผ ์
๋ก๋ ์ค: 10%"๋ผ๊ณ ์๋ฆฝ๋๋ค. ๋ง์ฝ aria-atomic
์ด false
(๊ธฐ๋ณธ๊ฐ)์๋ค๋ฉด, ์ปจํ
์คํธ๊ฐ ๋ถ์กฑํ "10%"๋ง ์๋ฆด ์ ์์ต๋๋ค.
aria-relevant
: ์ด๋ค ๋ณ๊ฒฝ์ด ์ค์ํ์ง ์ง์ ํ๊ธฐ
์ด ์์ฑ์ ๋ผ์ด๋ธ ๋ฆฌ์ ๋ด์์ ์ด๋ค ์ ํ์ ๋ณ๊ฒฝ์ด ์๋ฆผ์ "๊ด๋ จ" ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋์ง๋ฅผ ์ ์ํฉ๋๋ค. ํ๋ ์ด์์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๊ฐ์ ๊ฐ์ง๋๋ค:
additions
: ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ถ๊ฐ๋ ์ ๋ ธ๋๋ฅผ ์๋ฆฝ๋๋ค.removals
: ๋ผ์ด๋ธ ๋ฆฌ์ ์์ ์ ๊ฑฐ๋ ๋ ธ๋๋ฅผ ์๋ฆฝ๋๋ค (๋ง์ ์๋๋ฆฌ์ค์์ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ง์๋๊ฑฐ๋ ์ ์ฉํจ).text
: ๋ผ์ด๋ธ ๋ฆฌ์ ๋ด ๊ธฐ์กด ๋ ธ๋์ ํ ์คํธ ์ฝํ ์ธ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆฝ๋๋ค.all
: ์์ ๋ชจ๋ ๊ฒ์ ์๋ฆฝ๋๋ค (`additions removals text`์ ๋์ผ).
aria-relevant
์ ๊ธฐ๋ณธ๊ฐ์ text additions
์
๋๋ค. role="log"
์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ additions
์
๋๋ค.
์์ (aria-relevant
):
์ฌ๋ฌ ์ฃผ์ ๊ฐ๊ฒฉ์ ํ์ํ๋ ์ฃผ์ ์์ธ ํ์๊ธฐ๋ฅผ ์๊ฐํด ๋ด ์๋ค. ๊ธฐ์กด ์ฃผ์ ๊ฐ๊ฒฉ์ ๋ณ๊ฒฝ์ด ์๋ ์๋ก์ด ์ฃผ์๋ง ์๋ ค์ง๊ธฐ๋ฅผ ์ํ๋ค๋ฉด:
<div aria-live="polite" aria-relevant="additions" id="stock-ticker">
<p>AAPL: $150.00</p>
<p>GOOG: $2500.00</p>
</div>
<!-- ์ ์ฃผ์์ด ์ถ๊ฐ๋ ๋ -->
<script>
const ticker = document.getElementById('stock-ticker');
const newStock = document.createElement('p');
newStock.textContent = 'MSFT: $300.00';
ticker.appendChild(newStock);
// ๊ธฐ์กด ์ฃผ์ ๊ฐ๊ฒฉ์ด ๋ณ๊ฒฝ๋์ด๋ aria-relevant="additions" ๋๋ฌธ์ ์๋ ค์ง์ง ์์
// ticker.querySelector('p').textContent = 'AAPL: $150.50'; // ์ด ๋ณ๊ฒฝ์ ์๋ ค์ง์ง ์์
</script>
๋ผ์ด๋ธ ๋ฆฌ์ ๊ตฌํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋ผ์ด๋ธ ๋ฆฌ์ ์ ํจ๊ณผ์ ์ธ ๊ตฌํ์ ๋จ์ํ ๊ธฐ์ ์ ๋ ธํ์ฐ๊ฐ ์๋ ์ฌ๋ ค ๊น์ ๊ณ ๋ ค๊ฐ ํ์ํฉ๋๋ค. ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋ฉด ์ ์ธ๊ณ์ ์ผ๋ก ์ง์ ์ผ๋ก ํฌ์ฉ์ ์ธ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค:
1. ์ฝํ ์ธ ๋ฅผ ๊ฐ๊ฒฐํ๊ณ ๋ช ํํ๊ฒ ์ ์งํ๊ธฐ
์คํฌ๋ฆฐ ๋ฆฌ๋ ์ฌ์ฉ์๋ ์ ๋ณด๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ๊ธธ๊ณ ์ฅํฉํ ์๋ฆผ์ ๋ฐฉํด๊ฐ ๋๊ณ ์ข์ ๊ฐ์ ์ค ์ ์์ต๋๋ค. ์ฌ์ฉ์์ ๋ชจ๊ตญ์ด๋ ์ธ์ง ๋ถํ์ ๊ด๊ณ์์ด ์งง๊ณ ํต์ฌ์ ์ด๋ฉฐ ์ดํดํ๊ธฐ ์ฌ์ด ๋ฉ์์ง๋ฅผ ์์ฑํ์ญ์์ค. ์ ๋ฌธ ์ฉ์ด๋ ๋ณต์กํ ๋ฌธ์ฅ ๊ตฌ์กฐ๋ฅผ ํผํ์ญ์์ค.
2. ๊ณผ๋ํ ์๋ฆผ ํผํ๊ธฐ
๋ชจ๋ ๋์ ๋ณ๊ฒฝ์ ๋ผ์ด๋ธ ๋ฆฌ์ ์ผ๋ก ๋ง๋ค๋ ค๋ ์ ํน์ ์ฐธ์ผ์ญ์์ค. ํนํ aria-live="assertive"
์ ๋จ์ฉ์ ๋์์๋ ์๋ฆผ ๊ณต์ธ๋ก ์ด์ด์ ธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ฌ์ฉ์์ ํ์ฌ ์ํ ์ดํด๋ ์์
์๋ฃ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ์ค์ํ ์
๋ฐ์ดํธ์ ์ง์คํ์ญ์์ค.
3. ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ ๋ต์ ์ผ๋ก ๋ฐฐ์นํ๊ธฐ
๋ผ์ด๋ธ ๋ฆฌ์ ์์ ์์ฒด๋ ๋น์ด ์๋๋ผ๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์์ ๋ถํฐ DOM์ ์กด์ฌํด์ผ ํฉ๋๋ค. aria-live
์์ฑ์ด๋ ๋ผ์ด๋ธ ๋ฆฌ์ ์์ ์์ฒด๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ค๋ฅธ ์คํฌ๋ฆฐ ๋ฆฌ๋ ๋ฐ ๋ธ๋ผ์ฐ์ ์์ ์ ๋ขฐํ ์ ์์ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ํจํด์ ์ฝํ
์ธ ๋ฅผ ๋ฐ์ ์ค๋น๊ฐ ๋ aria-live
์์ฑ์ ๊ฐ์ง ๋น div
๋ฅผ ๋๋ ๊ฒ์
๋๋ค.
4. ์ด์ ๊ด๋ฆฌ ๋ณด์ฅํ๊ธฐ
๋ผ์ด๋ธ ๋ฆฌ์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆฌ์ง๋ง ์๋์ผ๋ก ์ด์ ์ ์ด๋ํ์ง๋ ์์ต๋๋ค. ๋์ ์ผ๋ก ๋ํ๋๋ ์ํธ์์ฉ ์์(์: ๊ฒฝ๊ณ ๋ฉ์์ง์ "๋ซ๊ธฐ" ๋ฒํผ ๋๋ ์๋ก ๋ก๋๋ ์์ ํ๋)์ ๊ฒฝ์ฐ, ์ฌ์ฉ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์๋ดํ๊ธฐ ์ํด ์ฌ์ ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ด์ ์ ๊ด๋ฆฌํด์ผ ํ ์ ์์ต๋๋ค.
5. ๊ธ๋ก๋ฒ ์ํฅ ๊ณ ๋ คํ๊ธฐ: ์ธ์ด ๋ฐ ์ฝ๊ธฐ ์๋
- ๋ค๊ตญ์ด ์ฝํ
์ธ : ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ ๋ผ์ด๋ธ ๋ฆฌ์ ๋ด์ ์ฝํ
์ธ ๋ ์ฌ์ฉ์๊ฐ ์ ํธํ๋ ์ธ์ด๋ก ์
๋ฐ์ดํธ๋๋๋ก ํ์ญ์์ค. ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ข
์ข
html
์์(๋๋ ํน์ ์์)์lang
์์ฑ์ ์ฌ์ฉํ์ฌ ๋ฐ์ ์์ง์ ๊ฒฐ์ ํฉ๋๋ค. ์ธ์ด๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ, ์ ํํ ๋ฐ์์ ์ํด ์ด ์์ฑ๋ ๊ทธ์ ๋ง๊ฒ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค. - ๋ฌธ๋งฅ์ ๋ช ํ์ฑ: ํ ๋ฌธํ๊ถ์์ ๋ช ํํ ๊ฒ์ด ๋ค๋ฅธ ๋ฌธํ๊ถ์์๋ ๋ชจํธํ ์ ์์ต๋๋ค. ๋ณดํธ์ ์ผ๋ก ์ดํด๋๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์๋ฅผ ๋ค์ด, "๊ฒฐ์ ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์ต๋๋ค"๋ ๋งค์ฐ ์ง์ญํ๋ ๊ธ์ต ์ฉ์ด๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ช ํํฉ๋๋ค.
- ์ ๋ฌ ์๋: ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ฌ์ฉ์๋ ์ฝ๊ธฐ ์๋๋ฅผ ์กฐ์ ํ ์ ์์ง๋ง, ์๋ฆผ์ ๋ค์ํ ์ฌ์ฉ์๊ฐ ์ดํดํ ์ ์๋๋ก ์ ๋นํ ์๋์์ ์ถฉ๋ถํ ๋ช ํํด์ผ ํฉ๋๋ค.
6. ์ ์ง์ ๊ธฐ๋ฅ ์ ํ ๋ฐ ์ค๋ณต์ฑ
๋ผ์ด๋ธ ๋ฆฌ์ ์ ๊ฐ๋ ฅํ์ง๋ง, ํนํ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ๋ณด์กฐ ๊ธฐ์ ์ด ARIA๋ฅผ ์์ ํ ์ง์ํ์ง ์์ ์ ์๋ ์ฌ์ฉ์๋ฅผ ์ํด ๋์ผํ ์ ๋ณด์ ๋ํ ๋์์ ์ธ ๋น์๊ฐ์ ์ ํธ๊ฐ ์๋์ง ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ๋ผ์ด๋ธ ๋ฆฌ์ ์๋ฆผ๊ณผ ํจ๊ป ์์ ๋ณ๊ฒฝ, ์์ด์ฝ ๋๋ ๋ช ํํ ํ ์คํธ ๋ ์ด๋ธ๊ณผ ๊ฐ์ ์๊ฐ์ ํ์๊ธฐ๋ ํจ๊ป ์ ๊ณตํด์ผ ํฉ๋๋ค.
7. ํ ์คํธ, ํ ์คํธ, ๊ทธ๋ฆฌ๊ณ ๋ ํ ์คํธํ๊ธฐ
๋ผ์ด๋ธ ๋ฆฌ์ ์ ๋์์ ์คํฌ๋ฆฐ ๋ฆฌ๋(NVDA, JAWS, VoiceOver, TalkBack)์ ๋ธ๋ผ์ฐ์ (Chrome, Firefox, Safari, Edge)์ ๋ค์ํ ์กฐํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ค์ ๋ณด์กฐ ๊ธฐ์ ์ฌ์ฉ์ ๋๋ ์๋ จ๋ ํ ์คํฐ์ ํจ๊ป ์ฒ ์ ํ ํ ์คํธ๋ฅผ ๊ฑฐ์ณ ์๋ฆผ์ด ์๋ํ ๋๋ก ์ธ์๋๋์ง ํ์ธํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ
์ข์ ์๋์๋ ๋ถ๊ตฌํ๊ณ ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ค์ฉ๋์ด ๋ณด์กฐ ๊ธฐ์ ์ฌ์ฉ์์๊ฒ ์ค๋ง์ค๋ฌ์ด ๊ฒฝํ์ ์ด๋ํ ์ ์์ต๋๋ค. ๋ค์์ ์ผ๋ฐ์ ์ธ ํจ์ ์ ๋๋ค:
1. aria-live="assertive"
์ค์ฉ
๊ฐ์ฅ ๋น๋ฒํ ์ค์๋ ์ค์ํ์ง ์์ ์ ๋ณด์ assertive
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. "๋ค์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค!" ๋ฉ์์ง๋ ์ฌ์ํ UI ์
๋ฐ์ดํธ๋ก ์ฌ์ฉ์๋ฅผ ๋ฐฉํดํ๋ ๊ฒ์ ์น์ฌ์ดํธ๊ฐ ๊ฑด๋๋ธ ์ ์๋ ๊ด๊ณ ๋ฅผ ๊ณ์ํด์ ํ์
ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ด๋ ๋งค์ฐ ๋ฐฉํด๊ฐ ๋๋ฉฐ ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ๋ฅผ ๋ ๋๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. assertive
๋ ์ง์ ์ผ๋ก ๊ธด๊ธํ๊ณ ์คํ ๊ฐ๋ฅํ ์ ๋ณด์๋ง ์ฌ์ฉํ์ญ์์ค.
2. ์ค๋ณต๋๋ ๋ผ์ด๋ธ ๋ฆฌ์
์ฌ๋ฌ ๊ฐ์ assertive
๋ผ์ด๋ธ ๋ฆฌ์ ์ด ์๊ฑฐ๋ ๋๋ฌด ์์ฃผ ์
๋ฐ์ดํธ๋๋ polite
๋ฆฌ์ ์ด ์์ผ๋ฉด ํผ๋์ค๋ฌ์ด ์๋ฆผ์ ๋ถํํ์์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ํ ๋จ์ผ ๊ธฐ๋ณธ ๋ผ์ด๋ธ ๋ฆฌ์ ๊ณผ, ์ ๋ง๋ก ํ์ํ ๊ฒฝ์ฐ์๋ง ์์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํ alert
์ ๊ฐ์ ํน์ ์ปจํ
์คํธ์ ๋ผ์ด๋ธ ๋ฆฌ์ ์ ๋ชฉํ๋ก ํ์ญ์์ค.
3. aria-live
์์ฑ ๋์ ์ถ๊ฐ/์ ๊ฑฐ
์์ ์ธ๊ธํ๋ฏ์ด, ๋ ๋๋ง๋ ํ ์์์ aria-live
์์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ ๋ขฐํ ์ ์์ต๋๋ค. ์ฒ์์๋ ๋ด์ฉ์ด ์๋๋ผ๋ ์ ์ ํ aria-live
(๋๋ role
) ์์ฑ์ด ์ด๋ฏธ HTML์ ์๋ ๋ผ์ด๋ธ ๋ฆฌ์ ์์๋ฅผ ๋ง๋์ญ์์ค. ๊ทธ๋ฐ ๋ค์ ํ์์ ๋ฐ๋ผ textContent
๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋ ์์ ์์๋ฅผ ์ถ๊ฐ/์ ๊ฑฐํ์ญ์์ค.
4. ์ด๊ธฐ ์ฝํ ์ธ ์๋ฆผ ๋ฌธ์
ํ์ด์ง๊ฐ ์ฒ์ ๋ก๋๋ ๋ ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ฝํ ์ธ ๊ฐ ์๋ ๊ฒฝ์ฐ, ํด๋น ์ฝํ ์ธ ๋ ๋์ค์ ๋ช ์์ ์ผ๋ก ์ ๋ฐ์ดํธ๋์ง ์๋ ํ ์ผ๋ฐ์ ์ผ๋ก "๋ณ๊ฒฝ"์ผ๋ก ์๋ ค์ง์ง ์์ต๋๋ค. ๋ผ์ด๋ธ ๋ฆฌ์ ์ *๋์ ์ ๋ฐ์ดํธ*๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ์ด๊ธฐ ์ฝํ ์ธ ๊ฐ ์๋ ค์ง๊ธฐ๋ฅผ ์ํ๋ค๋ฉด, ํ์ด์ง์ ๊ธฐ๋ณธ ์ฝํ ์ธ ํ๋ฆ์ ์ผ๋ถ๋ก ์๋ ค์ง๊ฒ ํ๊ฑฐ๋ ํ์ ์ ๋ฐ์ดํธ๊ฐ ๋ผ์ด๋ธ ๋ฆฌ์ ์ ํธ๋ฆฌ๊ฑฐํ๋๋ก ํ์ญ์์ค.
5. ์ ์ธ๊ณ์ ๊ฑธ์น ๋ถ์ถฉ๋ถํ ํ ์คํธ
Windows์ NVDA์์ ์๋ฒฝํ๊ฒ ์๋ํ๋ ๋ผ์ด๋ธ ๋ฆฌ์ ์ด iOS์ VoiceOver๋ JAWS์์๋ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์์ต๋๋ค. ๋ํ ์คํฌ๋ฆฐ ๋ฆฌ๋์ ๋ค๋ฅธ ์ธ์ด ์ค์ ์ ๋ฐ์๊ณผ ์ดํด์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ํญ์ ๋ค์ํ ๋ณด์กฐ ๊ธฐ์ ๋ก ํ ์คํธํ๊ณ , ๊ฐ๋ฅํ๋ค๋ฉด ๋ค์ํ ์ธ์ด ๋ฐฐ๊ฒฝ์ ๊ฐ์ง ์ฌ์ฉ์์ ํจ๊ป ํ ์คํธํ์ฌ ์์์น ๋ชปํ ๋์์ ํ์ ํ์ญ์์ค.
๊ณ ๊ธ ์๋๋ฆฌ์ค ๋ฐ ๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPAs) ๋ฐ ๋ผ์ฐํ
SPA์์๋ ๊ธฐ์กด์ ํ์ด์ง ์๋ก๊ณ ์นจ์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๊ฐ์ ํ์ด์ง ์ฌ์ด๋ฅผ ํ์ํ ๋ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ข
์ข
์ ํ์ด์ง ์ ๋ชฉ์ด๋ ์ฃผ์ ์ฝํ
์ธ ๋ฅผ ์๋ฆฌ์ง ์์ต๋๋ค. ์ด๋ ๋ผ์ด๋ธ ๋ฆฌ์ ์ด ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ ์ผ๋ฐ์ ์ธ ์ ๊ทผ์ฑ ๋ฌธ์ ์ด๋ฉฐ, ์ข
์ข
์ด์ ๊ด๋ฆฌ ๋ฐ ARIA role="main"
๋๋ role="document"
์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
์ ๋ต: ๋ผ์ฐํธ ์๋ฆผ์ ์ํ ๋ผ์ด๋ธ ๋ฆฌ์ ์ ๋ง๋ญ๋๋ค. ์ ๋ทฐ๊ฐ ๋ก๋๋๋ฉด ์ด ๋ฆฌ์ ์ ์ ํ์ด์ง ์ ๋ชฉ์ด๋ ์ ์ฝํ ์ธ ์ ์์ฝ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ๋ํ ์ด์ ์ด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ ๋ทฐ์ ์ฃผ์ ์ ๋ชฉ์ด๋ ๋ ผ๋ฆฌ์ ์ธ ์์ ์ง์ ์ผ๋ก ์ด๋ํ๋๋ก ํฉ๋๋ค.
์์ (SPA ๋ผ์ฐํธ ์๋ฆผ):
<div aria-live="polite" aria-atomic="true" id="route-announcer" class="sr-only"></div>
<!-- ๋ผ์ฐํ
๋ก์ง ๋ด๋ถ -->
<script>
function navigateTo(pageTitle, mainContentId) {
document.getElementById('route-announcer').textContent = `${pageTitle} ํ์ด์ง๋ก ์ด๋ํ์ต๋๋ค.`;
// ... ์ ์ฝํ
์ธ ๋ฅผ ๋ก๋ํ๋ ๋ก์ง ...
const mainContent = document.getElementById(mainContentId);
if (mainContent) {
mainContent.setAttribute('tabindex', '-1');
mainContent.focus();
}
}
// ์ฌ์ฉ ์์:
// navigateTo('์ ํ ์์ธ ์ ๋ณด', 'product-details-content');
</script>
sr-only
ํด๋์ค(์ข
์ข
`position: absolute; left: -9999px;` ๋ฑ)๋ div๋ฅผ ์๊ฐ์ ์ผ๋ก ์จ๊ธฐ์ง๋ง ์คํฌ๋ฆฐ ๋ฆฌ๋์๊ฒ๋ ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ์ ์งํฉ๋๋ค.
์ค์๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํฌํจํ ๋ณต์กํ ์์
์์์ ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ฃผ์ ํ๋ณด์ด๋ฉฐ, ํนํ ์ ์ฒด ํ์ด์ง ์ ์ถ ์์ด ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์ฆ์ ๋ฐ์ํ ๋ ๊ทธ๋ ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ ์ ํจ์ฑ์ ๋ํ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ฌ์ฉ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ ๋ต: "์ด๋ฉ์ผ ํ์์ด ์ ํจํ์ง ์์ต๋๋ค"์ ๊ฐ์ ์ค์ํ๊ณ ์ฆ๊ฐ์ ์ธ ์ค๋ฅ์๋ role="alert"
๋ฅผ ์ฌ์ฉํฉ๋๋ค. "๋น๋ฐ๋ฒํธ ๊ฐ๋: ๊ฐํจ"๊ณผ ๊ฐ์ ๋ ์ค์ํ๊ฑฐ๋ ์ ๋ณด ์ ๊ณต์ ์ธ ํผ๋๋ฐฑ์๋ aria-describedby
๋ฅผ ํตํด ์
๋ ฅ ํ๋์ ์ฐ๊ฒฐ๋ role="status"
๋๋ aria-live="polite"
๋ฆฌ์ ์ด ํจ๊ณผ์ ์ผ ์ ์์ต๋๋ค.
๋์ ์ ๋ ฌ/ํํฐ๋ง ๊ธฐ๋ฅ์ด ์๋ ๋ฐ์ดํฐ ํ ์ด๋ธ
์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ ํ ์ด๋ธ์ ์ ๋ ฌํ๊ฑฐ๋ ํํฐ๋งํ๋ฉด ์๊ฐ์ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋ฉ๋๋ค. ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์๋ก์ด ์ ๋ ฌ ์์๋ ํํฐ๋ง๋ ๊ฒฐ๊ณผ์ ์๋ฅผ ์๋ฆด ์ ์์ต๋๋ค.
์ ๋ต: ์ ๋ ฌ ๋๋ ํํฐ ์์
ํ, role="status"
๋ฆฌ์ ์ "ํ
์ด๋ธ์ด '์ ํ๋ช
'์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์์ต๋๋ค." ๋๋ "ํ์ฌ 100๊ฐ ์ค 25๊ฐ ๊ฒฐ๊ณผ๋ฅผ ํ์ํฉ๋๋ค."์ ๊ฐ์ ๋ฉ์์ง๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
์ค์๊ฐ ์๋ฆผ (์ฑํ , ๋ด์ค ํผ๋)
role="log"
์์ ๋ค๋ฃฌ ๋ฐ์ ๊ฐ์ด, ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉ์๊ฐ ์ง์์ ์ผ๋ก ํ์ธํ๊ฑฐ๋ ์๋ก ๊ณ ์น ํ์ ์์ด ์ ์ฝํ
์ธ ๋ฅผ ์๋ฆฌ๊ธฐ ์ํด ๋ผ์ด๋ธ ๋ฆฌ์ ์ผ๋ก๋ถํฐ ํฐ ์ด์ ์ ์ป์ต๋๋ค.
์ ๋ต: ๋ํํ ๋๋ ์๊ฐ์ ์ฝํ
์ธ ์ role="log"
๋ฅผ ๊ตฌํํฉ๋๋ค. ์๋ก์ด ์ถ๊ฐ ์ฌํญ์ด ๋ก๊ทธ์ ๋์ ์ถ๊ฐ๋๋๋ก ํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ์ปจํ
์ด๋๊ฐ ์คํฌ๋กค ์์น๋ฅผ ๊ด๋ฆฌํ๋๋ก ํฉ๋๋ค.
๋ค๊ตญ์ด ์ฝํ ์ธ ๋ฐ ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ธ์ด ์ค์
๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ lang
์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ฝํ
์ธ ๋ฅผ ๋ฐ์ํ๋ ค๊ณ ์๋ํฉ๋๋ค. ๋ผ์ด๋ธ ๋ฆฌ์ ์ด ๋ค๋ฅธ ์ธ์ด์ ์ฝํ
์ธ ๋ก ๋์ ์ผ๋ก ์
๋ฐ์ดํธ๋๋ ๊ฒฝ์ฐ, ๋ผ์ด๋ธ ๋ฆฌ์ ์์(๋๋ ๊ทธ ์ฝํ
์ธ )์ lang
์์ฑ๋ ๊ทธ์ ๋ง๊ฒ ์
๋ฐ์ดํธ๋๋๋ก ํ์ญ์์ค.
์์:
<div aria-live="polite" id="localized-message">Welcome!</div>
<!-- ๋์ค์ ํ๋์ค์ด ์ฝํ
์ธ ๋ก ์
๋ฐ์ดํธ -->
<script>
const messageDiv = document.getElementById('localized-message');
messageDiv.setAttribute('lang', 'fr');
messageDiv.textContent = 'Bienvenue !';
</script>
lang="fr"
๊ฐ ์์ผ๋ฉด ์์ด๋ก ๊ตฌ์ฑ๋ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ "Bienvenue !"๋ฅผ ์๋นํ ์๋ชป ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ฒฝ๊ณ ๋ฐ ์๋ฆผ์ ๋ํ ๋ฌธํ์ ๋งฅ๋ฝ
๊ฒฝ๊ณ ์ ๊ธด๊ธ์ฑ๊ณผ ํํ ๋ฐฉ์์ ๋ฌธํ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ธ์๋ ์ ์์ต๋๋ค. ์ง์ ์ ์ด๊ณ ๋จํธํ ๋ฉ์์ง๋ ํ ์ง์ญ์์๋ ๋์์ด ๋๋ ๊ฒ์ผ๋ก ๋ณด์ผ ์ ์์ง๋ง ๋ค๋ฅธ ์ง์ญ์์๋ ์ง๋์น๊ฒ ๊ณต๊ฒฉ์ ์ผ๋ก ๋ณด์ผ ์ ์์ต๋๋ค. ๊ฐ๊ฒฐํจ์ ์ ์ฝ ๋ด์์๋ ๊ฐ๋ฅํ๋ฉด assertive
์๋ฆผ์ ํค์ ๋ฌธํ์ ์ผ๋ก ๋ฏผ๊ฐํ๊ฒ ์กฐ์ ํ์ญ์์ค.
๊ธ๋ก๋ฒ ์ ๊ทผ์ฑ์ ์ํ ๋ผ์ด๋ธ ๋ฆฌ์ ํ ์คํธ
ํ ์คํธ๋ ๋จ์ํ ๋ง์ง๋ง ๋จ๊ณ๊ฐ ์๋๋ผ ์ง์์ ์ธ ๊ณผ์ ์ ๋๋ค. ๋ผ์ด๋ธ ๋ฆฌ์ ์ ๊ฒฝ์ฐ, ๊ทธ ๋์์ด ์คํฌ๋ฆฐ ๋ฆฌ๋-๋ธ๋ผ์ฐ์ ์กฐํฉ์ ํฌ๊ฒ ์์กดํ๊ธฐ ๋๋ฌธ์ ํนํ ์ค์ํฉ๋๋ค.
1. ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ฌ์ฉํ ์๋ ํ ์คํธ
์ด๊ฒ์ด ๊ฐ์ฅ ์ค์ํ ๋จ๊ณ์ ๋๋ค. ๋์ ๊ณ ๊ฐ์ด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ธ๋ก๋ฒ ๋งฅ๋ฝ์์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- NVDA (NonVisual Desktop Access): ๋ฌด๋ฃ, ์คํ ์์ค, ์ ์ธ๊ณ์ ์ผ๋ก Windows์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
- JAWS (Job Access With Speech): ์์ ์ฉ, ๊ฐ๋ ฅํ๋ฉฐ Windows์์ ๋งค์ฐ ์ธ๊ธฐ๊ฐ ์์ต๋๋ค.
- VoiceOver: Apple macOS ๋ฐ iOS ์ฅ์น์ ๋ด์ฅ๋์ด ์์ต๋๋ค.
- TalkBack: Android ์ฅ์น์ ๋ด์ฅ๋์ด ์์ต๋๋ค.
- ๋ด๋ ์ดํฐ: Windows์ ๋ด์ฅ๋์ด ์์ต๋๋ค (NVDA/JAWS๋ณด๋ค ๊ธฐ๋ฅ์ ์ ์ง๋ง ๊ธฐ๋ณธ ํ์ธ์๋ ์ข์).
ํ ์คํธ ์๋๋ฆฌ์ค:
polite
์๋ฆผ์ด ์ ์ ํ ์ค๋จ ์์ ์ ๋ฐ์ํ๋์ง ํ์ธํฉ๋๋ค.assertive
์๋ฆผ์ด ์ฆ์ ๊ทธ๋ฆฌ๊ณ ์ ํํ๊ฒ ์ค๋จํ๋์ง ํ์ธํฉ๋๋ค.- ๊ด๋ จ๋ ์ฝํ
์ธ ๋ง ์๋ ค์ง๋์ง ํ์ธํฉ๋๋ค (
aria-atomic
๋ฐaria-relevant
์ฌ์ฉ). - ์คํฌ๋ฆฐ ๋ฆฌ๋๊ฐ ๋ค๋ฅธ ์ฝํ ์ธ ๋ฅผ ์ฝ๊ณ ์์ ๋ ํ ์คํธํฉ๋๋ค. ๋ผ์ด๋ธ ๋ฆฌ์ ์ด ์ฌ์ ํ ์๋ ค์ง๋๊น?
- ๋๋ฆฐ ๋คํธ์ํฌ ์กฐ๊ฑด์ด๋ ๋ณต์กํ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์๋ฆผ์ด ๋๋ฝ๋๊ฑฐ๋ ์๋ชป ๋๊ธฐ์ด์ ๋ค์ด๊ฐ๋์ง ํ์ธํฉ๋๋ค.
- ์คํฌ๋ฆฐ ๋ฆฌ๋์ ๋ค๋ฅธ ์ธ์ด ์ค์ ์ ํ ์คํธํ์ฌ ๋ผ์ด๋ธ ๋ฆฌ์ ์ฝํ ์ธ ์ ๋ฐ์์ ํ์ธํฉ๋๋ค.
2. ์๋ํ๋ ์ ๊ทผ์ฑ ๋๊ตฌ
Google Lighthouse, axe-core, Wave์ ๊ฐ์ ๋๊ตฌ๋ ์ผ๋ฐ์ ์ธ ARIA ๊ตฌํ ์ค๋ฅ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ง๋ง, ๋ผ์ด๋ธ ๋ฆฌ์ ์ *๋์*์ ์์ ํ ๊ฒ์ฆํ ์๋ ์์ต๋๋ค. ๊ตฌ์กฐ์ ๋ฌธ์ (์: ์๋ชป๋ ARIA ์์ฑ)๋ฅผ ํฌ์ฐฉํ๋ ๋ฐ๋ ์ข์ง๋ง, ์๋ฆผ์ด ์ค์ ๋ก ๋ฐ์ํ๋์ง ๋๋ ์ฌ๋ฐ๋ฅด๊ฒ ํํ๋์๋์ง๋ฅผ ํ์ธํ๋ ๋ฐ๋ ์ ํฉํ์ง ์์ต๋๋ค.
3. ๋ค์ํ ๊ฐ์ธ๋ค๊ณผ์ ์ฌ์ฉ์ ํ ์คํธ
๊ถ๊ทน์ ์ธ ํ ์คํธ๋ ์ค์ ์ฌ์ฉ์, ํนํ ์ ๊ธฐ์ ์ผ๋ก ๋ณด์กฐ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค๊ณผ ํจ๊ปํ๋ ๊ฒ์ ๋๋ค. ๋ค์ํ ์ง์ญ ๋ฐ ์ธ์ด ๋ฐฐ๊ฒฝ์ ๊ฐ์ง ์ฌ์ฉ์๋ค์ ์ฐธ์ฌ์์ผ ๋ผ์ด๋ธ ๋ฆฌ์ ์ด ์ด๋ป๊ฒ ์ธ์๋๊ณ ์ค์ ๋ก ์ฌ์ฉ์ฑ์ ํฅ์์ํค๋์ง์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ป์ผ์ญ์์ค.
4. ๊ต์ฐจ ๋ธ๋ผ์ฐ์ ๋ฐ ๊ต์ฐจ ์ฅ์น ํ ์คํธ
๋ผ์ด๋ธ ๋ฆฌ์ ์ด ์ฃผ์ ๋ธ๋ผ์ฐ์ (Chrome, Firefox, Safari, Edge) ๋ฐ ์ฅ์น(๋ฐ์คํฌํฑ, ๋ชจ๋ฐ์ผ)์์ ์ผ๊ด๋๊ฒ ์๋ํ๋์ง ํ์ธํ์ญ์์ค. ์ผ๋ถ ๋ธ๋ผ์ฐ์ /์คํฌ๋ฆฐ ๋ฆฌ๋ ์กฐํฉ์ ๋ผ์ด๋ธ ๋ฆฌ์ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์์ ์ ์์ต๋๋ค.
๋ผ์ด๋ธ ๋ฆฌ์ ๊ณผ ์น ์ ๊ทผ์ฑ์ ๋ฏธ๋
WAI-ARIA ์ฌ์์ ์๋ก์ด ์น ํจํด์ ๋ค๋ฃจ๊ณ ๊ธฐ์กด ํจํด์ ๊ฐ์ ํ๋ ์๋ก์ด ๋ฒ์ ์ผ๋ก ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์น ๊ฐ๋ฐ ํ๋ ์์ํฌ๊ฐ ๋์ฑ ์ ๊ตํด์ง์ ๋ฐ๋ผ ์ ๊ทผ์ฑ ๊ธฐ๋ฅ๋ ํตํฉํ๊ณ ์์ผ๋ฉฐ, ๋๋ก๋ ARIA ์์ฑ์ ์ง์ ์ ์ธ ์ฌ์ฉ์ ์ถ์ํํ๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ผ์ด๋ธ ๋ฆฌ์ ์ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ ๊ฐ๋ฐ์๊ฐ ํน์ ์๊ตฌ์ ๋ง๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐ ๊ณ์ํด์ ์ค์ํ ๊ฒ์ ๋๋ค.
๋ณด๋ค ํฌ์ฉ์ ์ธ ์น์ ํฅํ ์ถ์ง๋ ฅ์ ๋์ฑ ๊ฐํด์ง ๊ฒ์ ๋๋ค. ์ ์ธ๊ณ ์ ๋ถ๋ ๋ ์๊ฒฉํ ์ ๊ทผ์ฑ ๋ฒ๋ฅ ์ ์ ์ ํ๊ณ ์์ผ๋ฉฐ, ๊ธฐ์ ๋ค์ ๋ชจ๋ ์ ์ฌ ์ฌ์ฉ์์๊ฒ ๋๋ฌํ๋ ๊ฒ์ ์์ฒญ๋ ๊ฐ์น๋ฅผ ์ธ์ํ๊ณ ์์ต๋๋ค. ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ด๋ฌํ ๋ ธ๋ ฅ์ ๊ธฐ๋ณธ ๋๊ตฌ์ด๋ฉฐ, ๋ ํ๋ถํ๊ณ ์ํธ์์ฉ์ ์ธ ๊ฒฝํ์ด ๋ชจ๋ ์ฌ๋์ด ์ด๋์๋ ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค.
๊ฒฐ๋ก
๋์ ์ฝํ ์ธ ๋ ํ๋ ์น์ ์ฌ์ฅ๋ถ์ด์ง๋ง, ์ ๊ทผ์ฑ์ ๋ํ ์ ์คํ ๊ณ ๋ ค ์์ด๋ ์ ์ธ๊ณ ์จ๋ผ์ธ ์ปค๋ฎค๋ํฐ์ ์๋น ๋ถ๋ถ์ ๋ฐฐ์ ํ ์ ์์ต๋๋ค. ARIA ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์ค์๊ฐ ์ ๋ฐ์ดํธ๊ฐ ์ผ๋ถ ์ฌ์ฉ์์๊ฒ๋ง ๋ณด์ด๋ ๊ฒ์ด ์๋๋ผ, ์คํฌ๋ฆฐ ๋ฆฌ๋ ๋ฐ ๊ธฐํ ๋ณด์กฐ ๊ธฐ์ ์ ์์กดํ๋ ์ฌ๋๋ค์ ํฌํจํ ๋ชจ๋ ์ฌ๋์ด ๋ฃ๊ณ ์ดํดํ ์ ์๋๋ก ๋ณด์ฅํ๋ ๊ฐ๋ ฅํ๊ณ ํ์คํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
aria-live
(polite
๋ฐ assertive
๊ฐ)๋ฅผ ์ ์คํ๊ฒ ์ ์ฉํ๊ณ , status
๋ฐ alert
์ ๊ฐ์ ์๋ฏธ๋ก ์ ์ญํ ์ ํ์ฉํ๋ฉฐ, aria-atomic
๋ฐ aria-relevant
๋ก ์๋ฆผ์ ์ธ์ฌํ๊ฒ ์ ์ดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ผ ๋ฟ๋ง ์๋๋ผ ๊น์ด ํฌ์ฉ์ ์ธ ์น ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. ํจ๊ณผ์ ์ธ ๊ตฌํ์ ๋จ์ํ ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ ์ด์์ด๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ์ฌ์ฉ์ ์๊ตฌ์ ๋ํ ๊น์ ์ดํด, ์ ์คํ ๊ณํ, ๋ช
ํํ ๋ฉ์์ง, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ์ฌ์ฉ์ ์ปจํ
์คํธ์ ๋ณด์กฐ ๊ธฐ์ ์ ๊ฑธ์น ์๊ฒฉํ ํ
์คํธ๊ฐ ํ์ํฉ๋๋ค.
ARIA ๋ผ์ด๋ธ ๋ฆฌ์ ์ ์์ฉํ๋ ๊ฒ์ ๋จ์ํ ๊ท์ ์ค์์ ๊ดํ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๊ฒ์ ์ง์ ์ผ๋ก ์ธ๋ฅ์๊ฒ ๋ด์ฌํ๋ ์น์ ๊ตฌ์ถํ๊ณ , ๋ฅ๋ ฅ์ด๋ ์ง๊ตฌ์์ ์์น์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ๋์๊ฒ ์ ๋ณด์ ์ํธ์์ฉ์ ๋ํ ๊ณตํํ ์ ๊ทผ์ ์ด์งํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ์ ๋์ ์น์ ๋ชจ๋์๊ฒ ์ง์ ์ผ๋ก ์ญ๋์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ํ์ ํฉ์๋ค.